<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>异步迭代生成器</title>
</head>
<body>
<script>
    function foo(err) {
        setTimeout(() => {
            if (err) {
                it.throw(new Error('发生了错误'))  // 可以通过it.throw抛出异常
            } else {
                it.next('完成了返回') // 3. 给第2步中yield赋值，迭代器继续迭代，此时main()中的text = '完成了返回'
            }
        }, 1500)
    }

    // 生成器
    function* main() {
        try {
            var text = yield foo(true); // 2. 先调用foo()，因为foo没有返回值，所以yield undefined.外面console.log()输出{value:undefined}
            console.log(text);
        } catch (err) {
            console.error(err); // 这里最骚的是可以通过try...catch捕获异步的异常，因为it.throw即生成器抛出的异常可以通过try...catch同步的捕获到
        }
    }

    var it = main();  // 创建生成器
    console.log(it.next());  // 1. 启动迭代器，执行到*main()中的yield那一行
    console.log('异步任务进行中')
</script>
</body>
</html>
